﻿using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using System.Xml;
using System.IO;
using System.Data;
using MoveToSPList.Properties;

namespace MoveToSPList
{
    class MoveData
    {
        /// <summary>
        /// Занесение данных в список Sharepoint
        /// </summary>
        /// <param name="path">Полный путь к файлу</param>
        /// <param name="listName">имя списка</param>
        /// <param name="siteUrl">Адрес узла</param>
        /// <param name="fieldMap">Словарь для переноса полей</param>
        /// <param name="sharepointKey">Ключевое поле в шарепоинте</param>
        /// <param name="xmlKey">Ключевое поле в файле</param>
        public static void MoveFromXmlToSPList(string path,
            string siteUrl,
            string listName,Dictionary<string,string> fieldMap,
            string sharepointKey,
            string xmlKey)
        {
            using (SPSite site = new SPSite(siteUrl))
            using(SPWeb web = site.OpenWeb())
            {
                DateTime start = DateTime.Now;


                Console.WriteLine("Обработка файла: " + path);
                SPList list = web.Lists[listName];                
                XmlDocument doc = new XmlDocument();
                // загружаем документ
                try { doc.Load(path); }
                catch (XmlException) { Console.WriteLine("Неправильно отформатирован файл:" + path); return; }
                // Перебираем все строки в импортируемом файле
                foreach (XmlNode item in doc.DocumentElement.ChildNodes)
                {
                    SPListItem spli = CreateOrUpdateItem(sharepointKey, xmlKey, list, item);                   
                    // Перебираем все поля которые мы обновляем
                    foreach (KeyValuePair<string,string> field in fieldMap)
                    {                        
                        SPField f = list.Fields.GetFieldByInternalName(field.Key);
                        // присваиваем значение 
                        if (f.Type == SPFieldType.DateTime)
                        { 
                            DateTime d;
                            if (DateTime.TryParse(item.Attributes[field.Value].Value, out d))
                                spli[f.Id] = d;
                        }
                        else
                            spli[f.Id] = item.Attributes[field.Value].Value;
                        // spli["Source"] = "XML file";
                    }
                    // обновляем элемент списка
                    try
                    {
                        spli.Update();
                    }
                    catch { Console.Write("Произошла ошибка при обновлении элемента"); }
                }
                FileInfo fi = new FileInfo(path);
                File.Move(path, Path.Combine(Settings.Default.DestFileName, fi.Name));
                DateTime end = DateTime.Now;
                Console.WriteLine(end - start);
               // File.Delete(path);                
            }            
        }                      
        /// <summary>
        /// Делаем запрос для получения элемента списка.
        /// </summary>
        /// <param name="sharepointKey">Ключевое поле в списке Sharepoint</param>
        /// <param name="xmlKey">Ключевое поле в импортируемом файле</param>
        /// <param name="list">Список шарепоинт</param>
        /// <param name="xmlElement">Элемент в импортируемом файле</param>
        /// <returns></returns>
        private static SPListItem CreateOrUpdateItem(string sharepointKey, string xmlKey, SPList list, XmlNode xmlElement)
        {
            #region Делаем запрос к списку для определения есть ли элемент в списке
            SPQuery query = new SPQuery();
            query.Query = string.Format(@"<Where>
      <Eq>
         <FieldRef Name='{0}' />
         <Value Type='Text'>{1}</Value>
      </Eq>
   </Where>", sharepointKey, xmlElement.Attributes[xmlKey].Value);

            SPListItemCollection coll = list.GetItems(query); 
            #endregion
            SPListItem spli = null;
            if (coll.Count >0)
                spli = coll[0];
            else
                spli = list.Items.Add();
            return spli;
        }
    }
}
